package cc.yugu.yhdw.webserver.service.hdw;

import cc.yugu.yhdw.common.domain.hdw.BatteryReportLog;
import cc.yugu.yhdw.common.entity.LocationInfo;
import cc.yugu.yhdw.common.entity.json.ExtResult;
import cc.yugu.yhdw.common.entity.pagination.Page;
import cc.yugu.yhdw.common.utils.YhdwUtils;
import cc.yugu.yhdw.webserver.persistence.hdw.BatteryReportLogMapper;
import cc.yugu.yhdw.webserver.service.AbstractService;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 电池上报日志业务
 * 
 * @Date:Created in 2018/7/5 16:45
 * @Author:
 * @Modified By: zxj 2018/7/25 16:45
 */ 
@Service
public class BatteryReportLogService extends AbstractService {
    @Autowired
    BatteryReportLogMapper batteryReportLogMapper;
    // 将给定的正则表达式编译成模式。
    static final Pattern LNG_PATTERN = Pattern.compile("(\\d{3})(\\d{2}.\\d{4})");
    static final Pattern LAT_PATTERN = Pattern.compile("(\\d{2})(\\d{2}.\\d{4})");

    /**
     * 分页查询
     *
     * @Param: [batteryReportLog]
     * @Return: cc.yugu.yhdw.common.entity.pagination.Page
     * @Author By: zjn 2018/7/5  16:47
     */
    public Page findPage(BatteryReportLog batteryReportLog) {
        Page page = batteryReportLog.buildPage();
        if (batteryReportLog.getCreateTime() == null) {
            batteryReportLog.setCreateTime(new Date());
        }
        String suffix = DateFormatUtils.format(batteryReportLog.getCreateTime(), "yyyyMM");
        batteryReportLog.setSuffix(suffix);
        page.setTotalItems(batteryReportLogMapper.findPageCount(batteryReportLog));
        batteryReportLog.setBeginIndex(page.getOffset());

        List<BatteryReportLog> batteryReportLogList = batteryReportLogMapper.findPageResult(batteryReportLog);
        page.setResult(batteryReportLogList);

        return page;
    }

    /**
     * 分页查询
     *
     * @Param: [search]
     * @Return: cc.yugu.yhdw.common.entity.pagination.Page
     * @Author By: zjn 2018/7/5  17:00
     */
    public Page findselectPage(BatteryReportLog search) {
        Page page = search.buildPage();
        if (search.getQueryBeginTime() == null && search.getQueryEndTime() == null) {
            Date queryBeginTime = batteryReportLogMapper.findLastReportTime(search.getOrderId(), search.getSuffix());
            queryBeginTime.setHours(0);
            queryBeginTime.setMinutes(0);
            queryBeginTime.setSeconds(0);
            search.setQueryBeginTime(queryBeginTime);
        }
        page.setTotalItems(batteryReportLogMapper.findAllMapCount(search.getOrderId(), search.getSuffix(), search.getQueryBeginTime(), search.getQueryEndTime()));
        search.setBeginIndex(page.getOffset());
        // 分页查询，按条件查询表hdw_battery_report_log_${suffix}，并将结果按照创建时间升序排列
        List<BatteryReportLog> list = batteryReportLogMapper.findSelectPageResult(search);
        List<BatteryReportLog> batteryReportLogs = new ArrayList<BatteryReportLog>();
        for (BatteryReportLog batteryReportLog : list) {
            double[] d = YhdwUtils.gspToBd(batteryReportLog.getLng(), batteryReportLog.getLat());
            batteryReportLog.setLng(d[0]);
            batteryReportLog.setLat(d[1]);
            batteryReportLogs.add(batteryReportLog);
        }
        page.setResult(batteryReportLogs);
        return page;
    }

    /**
     * 查询表 hdw_battery_report_log_${suffix}
     *
     * @Param: [orderId, createTime, startDate, endDate]
     * @Return: java.util.List<cc.yugu.yhdw.common.entity.LocationInfo>
     * @Author By: zjn 2018/7/5  17:01
     */
    public List<LocationInfo> findAllMap(String orderId, Date createTime, Date startDate, Date endDate) {
        String suffix = DateFormatUtils.format(createTime, "yyyyMM");
        List<LocationInfo> result = new ArrayList<LocationInfo>();
        if (startDate == null && endDate == null) {
            startDate = batteryReportLogMapper.findLastReportTime(orderId, suffix);
            startDate.setHours(0);
            startDate.setMinutes(0);
            startDate.setSeconds(0);
        }
        // 判断根据表名查询的内容是否为空
        if (StringUtils.isNotEmpty(batteryReportLogMapper.findTableExist("hdw_battery_report_log_" + suffix))) {
            result = batteryReportLogMapper.findAllMap(orderId, suffix, startDate, endDate);
        }
        return result;
    }

    /**
     * 查询当前日期下的表
     *
     * @Param: [orderId, createTime]
     * @Return: cc.yugu.yhdw.common.entity.json.ExtResult
     * @Author By: zjn 2018/7/5  17:03
     */
    public ExtResult findAllMapCount(String orderId, Date createTime) {
        String suffix = DateFormatUtils.format(createTime, "yyyyMM");
        if (StringUtils.isNotEmpty(batteryReportLogMapper.findTableExist("hdw_battery_report_log_" + suffix))) {
            // 查询表，返回行数
            int total = batteryReportLogMapper.findAllMapCount(orderId, suffix, null, null);
            if (total > 0) {
                return ExtResult.successResult();
            }
        }
        return ExtResult.failResult("");
    }

    /**
     * 更新地址
     *
     * @Param: [batteryOrderBatteryReportLog]
     * @Return: cc.yugu.yhdw.common.entity.json.ExtResult
     * @Author By: zjn 2018/7/5  17:03
     */
    public ExtResult updateAddress(BatteryReportLog batteryOrderBatteryReportLog) {
        int total = batteryReportLogMapper.updateAddress(batteryOrderBatteryReportLog);
        if (total > 0) {
            return ExtResult.successResult();
        }
        return ExtResult.failResult("修改位置失败");
    }

    /**
     * 查询电池id，并按照电池id分组
     *
     * @Param: []
     * @Return: java.util.List<java.lang.String>
     * @Author By: zjn 2018/7/5  17:27
     */
    public List<String> findBatteryId() {
        return batteryReportLogMapper.findBatteryId();
    }

    /**
     * 查询经纬度
     *
     * @Param: [batteryReportLog]
     * @Return: java.util.List<java.util.Map < java.lang.String , java.lang.Double>>
     * @Author By: zjn 2018/7/5  17:27
     */
    public List<Map<String, Double>> find(BatteryReportLog batteryReportLog) {
        // 按条件查询表hdw_battery_report_log中经纬度，并按照创建时间排序
        List<Map<String, Double>> list = batteryReportLogMapper.find(batteryReportLog);
        for (Map<String, Double> map : list) {
            // replaceAll(" ", "0")：用'0' 替换 " " ;然后按照指定格式输出
            String lng = String.format("%-10s", map.get("lng").toString()).replaceAll(" ", "0");
            String lat = String.format("%-9s", map.get("lat").toString()).replaceAll(" ", "0");
            // 如果 '.' 在lng 中第一次出现的索引值为 5
            if (lng.indexOf(".") == 5) {
                Matcher lngMatcher = LNG_PATTERN.matcher(lng);
                if (lngMatcher.find()) {
                    double longitude = Double.parseDouble(lngMatcher.group(1)) + Double.parseDouble(lngMatcher.group(2)) / 60;
                    map.put("lng", longitude);
                }
                Matcher latMatcher = LAT_PATTERN.matcher(lat);
                if (latMatcher.find()) {
                    double latitude = Double.parseDouble(latMatcher.group(1)) + Double.parseDouble(latMatcher.group(2)) / 60;
                    map.put("lat", latitude);
                }
            }
        }
        return list;
    }

    /**
     * 按条件查询表hdw_battery_report_log中 订单id，返回分组后的订单id，（按照创建时间降序排列）
     * 根据电池id查询订单列表信息(表中無数据，二代更新数据库结构）
     *
     * @Param: [batteryId, bicycleNo]
     * @Return: java.util.List<java.lang.String>
     * @Author By: zjn 2018/7/5  17:47
     */
    public List<String> findOrderId(String batteryId, String bicycleNo) {
        return batteryReportLogMapper.findOrderId(batteryId, bicycleNo);
    }

    /**
     * 查询经纬度(业务重构）
     *
     * @Param: [batteryReportLog]
     * @Return: java.util.List<java.util.Map < java.lang.String , java.lang.Double>>
     * @Author By: zjn 2018/7/5  17:27
     */
    public List<Map<String, Double>> findCoordinates(BatteryReportLog batteryReportLog) {
        /*
         业务处理：(参数：batteryReportLog.orderId)
            1.查询这个订单是否存在。
            2.订单的开始和结束时间。
                2.1. 判断条件：（订单表）
                        订单取出电池为开始，这个电池放入柜机为结束。
                        订单取出电池为开始，这个电池又取出为结束。

            3.步骤：
                3.1. 通过订单Id去订单表中查询这个订单的信息（订单状态为成功--4），
                3.2. 订单信息获取“取新电池”的电池Id，
                3.3. 通过这个电池Id在订单表中查询下一个关于这个电池的订单（成功的订单）信息，
                3.4. 判断是否存在下一个订单，如果有则这两个订单的间隔时间就是这个订单的生存时间，
                3.5. 判断这两个订单是否跨月份和间隔时间长短，
                3.6. 如果间隔时间过长（则提示超时异常订单）--这个功能估计要实现在页面上设置，
                3.7. 如果订单跨月份则通过另外一个业务实现查询（这个跨表查询延迟高），
            4.问题：
                4.1. 订单的状态会影响以上的判断。
            5.返回：
                List<Map<String, Double>>
            6.操作：
                6.1 今日轨迹
                6.2 昨日轨迹
                6.3 日期查询轨迹
                6.4 订单查询轨迹
         */

        /*
         判断页面的操作：
            1.查看batteryReportLog中是否有时间限制
                有    1,2,3
                        截取日期后缀 （201807）
                没有  4

         */
        if (batteryReportLog.getCreateTime() != null) {
            // 截取日期后缀(赋值给地址属性）
            String suffix = DateFormatUtils.format(batteryReportLog.getCreateTime(), "yyyyMM");

            batteryReportLog.setSuffix(suffix);
            /*suffix = batteryReportLog.getCreateTime().getMonth() + suffix;
            batteryReportLog.setAddress(suffix);*/
            /*
               6.1 今日轨迹(参数：batteryReportLog电池id和开始时间）
               6.2 昨日轨迹
               6.3 日期查询轨迹
            */
            List<Map<String, Double>> list = batteryReportLogMapper.queryCoordinates(batteryReportLog);

            // 返回处理
            for (Map<String, Double> map : list) {
                // replaceAll(" ", "0")：用'0' 替换 " " ;然后按照指定格式输出
                String lng = String.format("%-10s", map.get("lng").toString()).replaceAll(" ", "0");
                String lat = String.format("%-9s", map.get("lat").toString()).replaceAll(" ", "0");
                // 如果 '.' 在lng 中第一次出现的索引值为 5
                if (lng.indexOf(".") == 5) {
                    Matcher lngMatcher = LNG_PATTERN.matcher(lng);
                    if (lngMatcher.find()) {
                        double longitude = Double.parseDouble(lngMatcher.group(1)) + Double.parseDouble(lngMatcher.group(2)) / 60;
                        map.put("lng", longitude);
                    }
                    Matcher latMatcher = LAT_PATTERN.matcher(lat);
                    if (latMatcher.find()) {
                        double latitude = Double.parseDouble(latMatcher.group(1)) + Double.parseDouble(latMatcher.group(2)) / 60;
                        map.put("lat", latitude);
                    }
                }
            }

            return list;

        }

        // 6.4 订单查询轨迹

        // 按条件查询表hdw_battery_report_log中经纬度，并按照创建时间排序
    /*    List<Map<String, Double>> list = batteryReportLogMapper.find(batteryReportLog);
        for (Map<String, Double> map : list) {
            // replaceAll(" ", "0")：用'0' 替换 " " ;然后按照指定格式输出
            String lng = String.format("%-10s", map.get("lng").toString()).replaceAll(" ", "0");
            String lat = String.format("%-9s", map.get("lat").toString()).replaceAll(" ", "0");
            // 如果 '.' 在lng 中第一次出现的索引值为 5
            if (lng.indexOf(".") == 5) {
                Matcher lngMatcher = LNG_PATTERN.matcher(lng);
                if (lngMatcher.find()) {
                    double longitude = Double.parseDouble(lngMatcher.group(1)) + Double.parseDouble(lngMatcher.group(2)) / 60;
                    map.put("lng", longitude);
                }
                Matcher latMatcher = LAT_PATTERN.matcher(lat);
                if (latMatcher.find()) {
                    double latitude = Double.parseDouble(latMatcher.group(1)) + Double.parseDouble(latMatcher.group(2)) / 60;
                    map.put("lat", latitude);
                }
            }
        }
        return list;
    }*/
        return null;
    }
}